#!/usr/local/python/bin/python
# coding=utf-8
__author__ = 'zht'

import sys

from tdtools import LogUtil
from tdtools import Common_tdsql_prd as Common
from tdtools import Config_tdsql_prd as Config
from tdtools.FileUtil import FileUtil

'''
Python 2.7默认使用ASCII编码，当代码中涉及非ASCII字符（如中文字符）时，
若未明确指定编码方式，会尝试用ASCII解码，导致UnicodeDecodeError。
'''
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
    reload(sys)
    sys.setdefaultencoding(default_encoding)

shellCode = 'SCAN'
bizType = 'SCAN'

_fileInfoObj = Common._fileInfoObj
_logger=LogUtil._logger

def init():
    global _fileMetaInfo, _fileInfoObj, _appInfoObj, _dbInfoObj, _tDSQLCon, _bizdate, _dataFile, _tranFile, _hdfsDir, _hdfsFile, _retainDaysNum, _retainMonthsNum, _dbCode
    Common.checkArgs()

    Common.initFileInfo()

    _fileInfoObj = Common._fileInfoObj

    Common.initAppInfo()
    _appInfoObj = Common._appInfoObj

    Common.initDbInfo()
    _dbInfoObj = Common._dbInfoObj

    Common.initTdConnInfo()
    _tDSQLCon = Common._tDSQLCon

    # 业务日期
    _bizdate = Common.getBizDate()
    # 载入文件路径
    _dataFile = Common.getSourceFilePath()

    # 元数据文件路径
    metaFile = Common.getMetaFilePath()

    _fileMetaInfo = Common.getFileMetaInfo(metaFile)

    # 数据库编码
    _dbCode = _dbInfoObj.getDbCode()

    # 需要保留的天数
    _retainDaysNum = _fileInfoObj.getKeepDayNum()

    # 保留月末的月数
    _retainMonthsNum = _fileInfoObj.getKeepMonthNum()


def checkLines():
    global _dataFile,_fileMetaInfo
    dataLineNums=int(_fileMetaInfo.get_data_line_nums())
    flgLineNums = int(FileUtil.getFileLineNums(_dataFile))
    message = '标记文件中记录'+ str(dataLineNums) + '行，源文件实际'  + str(flgLineNums) + '行'
    _logger.info(message)
    if not dataLineNums == flgLineNums:
        _logger.error("标记文件中文件行数和源文件不匹配")
        Common.exit(Config.RUNNING_ERROR, shellCode, message)
        Common.extExit(shellCode)



def main():
    global _logFile, _logPrefix,_fileInfoObj
    # 初始化信息,TDSQL的连接信息、元数据文件路径、源文件路径、分割符、库表名称
    init()

    # 检测数据行数
    checkLines()



if __name__ == "__main__":
    # todo 全局异常处理器
    # sys.excepthook = global_exception_handler
    try:
        main()
    except Exception as e:
        _logger.error(e, exc_info=True)
        Common.exit(Config.RUNNING_ERROR, shellCode, e)
    else:
        _logger.info("执行完成")
        Common.exit(Config.RUNNING_SUCCESS, shellCode,"脚本执行成功")